/**
 * 媒体文件工具函数
 * 用于获取视频、音频文件的时长等信息
 */

/**
 * 获取视频文件的时长（秒）
 * @param file 视频文件
 * @returns Promise<number> 时长（秒）
 */
export const getVideoDuration = (file: File): Promise<number> => {
    return new Promise((resolve, reject) => {
        const video = document.createElement('video');
        video.preload = 'metadata';

        video.onloadedmetadata = () => {
            window.URL.revokeObjectURL(video.src);
            resolve(video.duration);
        };

        video.onerror = () => {
            window.URL.revokeObjectURL(video.src);
            reject(new Error('无法加载视频文件'));
        };

        video.src = URL.createObjectURL(file);
    });
};

/**
 * 获取音频文件的时长（秒）
 * @param file 音频文件
 * @returns Promise<number> 时长（秒）
 */
export const getAudioDuration = (file: File): Promise<number> => {
    return new Promise((resolve, reject) => {
        const audio = document.createElement('audio');
        audio.preload = 'metadata';

        audio.onloadedmetadata = () => {
            window.URL.revokeObjectURL(audio.src);
            resolve(audio.duration);
        };

        audio.onerror = () => {
            window.URL.revokeObjectURL(audio.src);
            reject(new Error('无法加载音频文件'));
        };

        audio.src = URL.createObjectURL(file);
    });
};

/**
 * 获取图片文件的默认时长（秒）
 * 图片文件没有时长概念，返回默认值
 * @param file 图片文件
 * @returns Promise<number> 默认时长（秒）
 */
export const getImageDuration = (file: File): Promise<number> => {
    // 图片默认显示5秒
    return Promise.resolve(5);
};

/**
 * 根据文件类型获取时长
 * @param file 文件
 * @returns Promise<number> 时长（秒）
 */
export const getMediaDuration = (file: File): Promise<number> => {
    const fileType = file.type;

    if (fileType.startsWith('video/')) {
        return getVideoDuration(file);
    } else if (fileType.startsWith('audio/')) {
        return getAudioDuration(file);
    } else if (fileType.startsWith('image/')) {
        return getImageDuration(file);
    } else {
        // 默认返回5秒
        return Promise.resolve(5);
    }
};

/**
 * 将秒转换为微秒
 * @param seconds 秒数
 * @returns 微秒数
 */
export const secondsToMicroseconds = (seconds: number): number => {
    return Math.round(seconds * 1000000);
};

/**
 * 将微秒转换为秒
 * @param microseconds 微秒数
 * @returns 秒数
 */
export const microsecondsToSeconds = (microseconds: number): number => {
    return microseconds / 1000000;
};
